#include <stdio.h>
#include <unistd.h>

#include <time.h>
#include <stdlib.h>

#include <sys/wait.h>


int main(int argc, char const *argv[])
{
    // 1. 父进程中创建管道
    int fd[2]; // 管道FD
    int ret = pipe(fd);
    if(ret != 0){
        perror("pipe");
        return -1;
    }

    // 2. 创建子进程，产生数据并写入到管道中
    if(fork() == 0){
        // 2.1 设置随机种子
        srand(time(NULL));

        // 2.2 关闭 管道的读端
        close(fd[0]);

        // 2.3 随机产生数据
        for(int i=0;i<10;i++){
            int n = rand()  % 100 + 1;
            // 2.4 向管道写入数据
            write(fd[1], &n, 4);

            // 2.5 下一次产生数据的间隔为 1s
            sleep(1);
        }
        close(fd[1]);  // 关闭管道写端
        _exit(0);
    }

    // 3. 父进程读取数据
    // 3.1 关闭管道的写端
    close(fd[1]);
    // 3.2 循环读取管道数据，直到返回-1 为止
    int data = 0;
    ssize_t len = -1;
    // 读取一个数据包（4 Byte）
    // 【重要】如果写端的进程退出后，read()将从阻塞状态解除，返回0
    while((len = read(fd[0], &data, 4)) != 0){
        printf("recv data: %d\n", data);
        data = 0;
    }
    wait(NULL); // 回收子进程
    // 3.3 关闭管道的读端
    close(fd[0]);
    return 0;
}
